#define GSK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_RENDERER, GskRenderer))
#define GSK_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_RENDERER))
-typedef struct _GskRenderer GskRenderer;
typedef struct _GskRendererClass GskRendererClass;
GDK_AVAILABLE_IN_3_90
/**
* gsk_render_node_get_draw_context:
* @node: a #GskRenderNode
+ * @renderer: (nullable): Renderer to optimize for or %NULL for any
*
* Creates a Cairo context for drawing using the surface associated
* to the render node.
+ * If no surface exists yet, a surface will be created optimized for
+ * rendering to @renderer.
*
* Returns: (transfer full): a Cairo context used for drawing; use
* cairo_destroy() when done drawing
* Since: 3.90
*/
cairo_t *
-gsk_render_node_get_draw_context (GskRenderNode *node)
+gsk_render_node_get_draw_context (GskRenderNode *node,
+ GskRenderer *renderer)
{
cairo_t *res;
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
g_return_val_if_fail (node->is_mutable, NULL);
+ g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);
if (node->surface == NULL)
{
- node->surface = gsk_renderer_create_cairo_surface (node->renderer,
- node->opaque ? CAIRO_FORMAT_RGB24
- : CAIRO_FORMAT_ARGB32,
- ceilf (node->bounds.size.width),
- ceilf (node->bounds.size.height));
+ if (renderer)
+ {
+ node->surface = gsk_renderer_create_cairo_surface (renderer,
+ node->opaque ? CAIRO_FORMAT_RGB24
+ : CAIRO_FORMAT_ARGB32,
+ ceilf (node->bounds.size.width),
+ ceilf (node->bounds.size.height));
+ }
+ else
+ {
+ node->surface = cairo_image_surface_create (node->opaque ? CAIRO_FORMAT_RGB24
+ : CAIRO_FORMAT_ARGB32,
+ ceilf (node->bounds.size.width),
+ ceilf (node->bounds.size.height));
+ }
}
res = cairo_create (node->surface);
GDK_AVAILABLE_IN_3_90
gboolean gsk_render_node_is_opaque (GskRenderNode *node);
GDK_AVAILABLE_IN_3_90
-cairo_t * gsk_render_node_get_draw_context (GskRenderNode *node);
+cairo_t * gsk_render_node_get_draw_context (GskRenderNode *node,
+ GskRenderer *renderer);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_set_blend_mode (GskRenderNode *node,
#include <gdk/gdk.h>
#include <gsk/gskenums.h>
+typedef struct _GskRenderer GskRenderer;
+
#endif /* __GSK_TYPES_H__ */
gtk_widget_get_clip (widget, &clip);
_gtk_widget_get_allocation (widget, &alloc);
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
context = gtk_widget_get_style_context (widget);
border_node = gsk_renderer_create_render_node (renderer);
gsk_render_node_set_name (border_node, str);
gsk_render_node_set_bounds (border_node, &bounds);
- cr = gsk_render_node_get_draw_context (border_node);
+ cr = gsk_render_node_get_draw_context (border_node, renderer);
gtk_css_style_render_border (style,
cr,
gsk_render_node_set_bounds (content_node, &content_bounds);
gsk_render_node_set_transform (content_node, &content_transform);
- cr = gsk_render_node_get_draw_context (content_node);
+ cr = gsk_render_node_get_draw_context (content_node, renderer);
/* Compatibility mode: draw_focus is left to the draw() implementation */
draw_focus = gadget_class->draw (gadget, cr,
gsk_render_node_set_name (focus_node, str);
gsk_render_node_set_bounds (focus_node, &bounds);
- cr = gsk_render_node_get_draw_context (focus_node);
+ cr = gsk_render_node_get_draw_context (focus_node, renderer);
gtk_css_style_render_outline (style,
cr,
clip.left + margin.left,
gtk_debug_updates_queue_get_extents (updates, &rect);
gsk_render_node_set_bounds (node, &(graphene_rect_t) GRAPHENE_RECT_INIT(rect.x, rect.y, rect.width, rect.height));
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
for (l = g_queue_peek_head_link (updates); l != NULL; l = l->next)
{
node = gtk_widget_create_render_node (widget, renderer, "FlowBox RubberBand");
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
vertical = priv->orientation == GTK_ORIENTATION_VERTICAL;
node = gtk_css_gadget_get_render_node (priv->gadget, renderer, FALSE);
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
/* We want to use the standard gadget drawing for the border,
* so we clip out the label allocation in order to get the
gtk_widget_get_clip (widget, &clip);
_gtk_widget_get_allocation (widget, &alloc);
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
x = 0;
y = 0;
gtk_widget_get_clip (widget, &clip);
_gtk_widget_get_allocation (widget, &alloc);
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
x = 0;
y = 0;
if (node == NULL)
return NULL;
- ct = gsk_render_node_get_draw_context (node);
+ ct = gsk_render_node_get_draw_context (node, renderer);
gtk_popover_draw (widget, ct);
cairo_destroy (ct);
bg_node = gsk_renderer_create_render_node (renderer);
gsk_render_node_set_name (bg_node, str);
gsk_render_node_set_bounds (bg_node, bounds);
- cr = gsk_render_node_get_draw_context (bg_node);
+ cr = gsk_render_node_get_draw_context (bg_node, renderer);
cairo_translate (cr, x, y);
_gtk_css_shadows_value_paint_box (box_shadow,
cr,
bg_node = gsk_renderer_create_render_node (renderer);
gsk_render_node_set_name (bg_node, str);
gsk_render_node_set_bounds (bg_node, bounds);
- cr = gsk_render_node_get_draw_context (bg_node);
+ cr = gsk_render_node_get_draw_context (bg_node, renderer);
cairo_translate (cr, x, y);
_gtk_theming_background_paint_color (&bg, cr, bg_color, background_image);
cairo_destroy (cr);
translate_blend_mode (blend_mode));
gsk_render_node_set_name (bg_node, str);
gsk_render_node_set_bounds (bg_node, bounds);
- cr = gsk_render_node_get_draw_context (bg_node);
+ cr = gsk_render_node_get_draw_context (bg_node, renderer);
cairo_translate (cr, x, y);
_gtk_theming_background_paint_layer (&bg, idx, cr, GTK_CSS_BLEND_MODE_NORMAL);
cairo_destroy (cr);
bg_node = gsk_renderer_create_render_node (renderer);
gsk_render_node_set_name (bg_node, str);
gsk_render_node_set_bounds (bg_node, bounds);
- cr = gsk_render_node_get_draw_context (bg_node);
+ cr = gsk_render_node_get_draw_context (bg_node, renderer);
cairo_translate (cr, x, y);
_gtk_css_shadows_value_paint_box (box_shadow,
cr,
gsk_render_node_set_bounds (tmp, &bounds);
gsk_render_node_set_transform (tmp, &m);
- cr = gsk_render_node_get_draw_context (tmp);
+ cr = gsk_render_node_get_draw_context (tmp, renderer);
cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
gtk_widget_draw_internal (widget, cr, TRUE);
cairo_destroy (cr);
gsk_render_node_set_name (tmp, str);
gsk_render_node_set_bounds (tmp, &bounds);
- cr = gsk_render_node_get_draw_context (tmp);
+ cr = gsk_render_node_get_draw_context (tmp, renderer);
cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
g_signal_emit (widget, widget_signals[DRAW], 0, cr, &result);
cairo_destroy (cr);
gsk_render_node_set_bounds (node, &bounds);
gsk_render_node_set_transform (node, &m);
- cr = gsk_render_node_get_draw_context (node);
+ cr = gsk_render_node_get_draw_context (node, renderer);
if (priv->client_decorated &&
priv->decorated &&